a11y: Update GtkCheckButton
authorMatthias Clasen <mclasen@redhat.com>
Fri, 17 Jul 2020 19:51:28 +0000 (15:51 -0400)
committerEmmanuele Bassi <ebassi@gnome.org>
Sun, 26 Jul 2020 19:31:15 +0000 (20:31 +0100)
This is a bit unfortunate, since the aria modelling
doesn't quite agree with ours, so we have to listen
for the togglebutton property change, and we inherit
the pressed state from the togglebutton accessible.

gtk/gtkcheckbutton.c

index efc0112791589bfee71b6bd70ad023f9841f2221..82e2fd5963a6b213f40d75e38eb06a42d952d301 100644 (file)
@@ -171,12 +171,43 @@ gtk_check_button_get_property (GObject      *object,
     }
 }
 
+static void
+update_accessible_state (GtkCheckButton *check_button)
+{
+  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (check_button);
+
+  GtkAccessibleTristate checked_state;
+
+  if (priv->inconsistent)
+    checked_state = GTK_ACCESSIBLE_TRISTATE_MIXED;
+  else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_button)))
+    checked_state = GTK_ACCESSIBLE_TRISTATE_TRUE;
+  else
+    checked_state = GTK_ACCESSIBLE_TRISTATE_FALSE;
+
+  gtk_accessible_update_state (GTK_ACCESSIBLE (check_button),
+                               GTK_ACCESSIBLE_STATE_CHECKED, checked_state,
+                               -1);
+}
+
+static void
+gtk_check_button_notify (GObject    *object,
+                         GParamSpec *pspec)
+{
+  if (pspec->name == I_("active"))
+    update_accessible_state (GTK_CHECK_BUTTON (object));
+
+  if (G_OBJECT_CLASS (gtk_check_button_parent_class)->notify)
+    G_OBJECT_CLASS (gtk_check_button_parent_class)->notify (object, pspec);
+}
+
 static void
 gtk_check_button_class_init (GtkCheckButtonClass *class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (class);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
 
+  object_class->notify = gtk_check_button_notify;
   object_class->finalize = gtk_check_button_finalize;
   object_class->set_property = gtk_check_button_set_property;
   object_class->get_property = gtk_check_button_get_property;
@@ -394,6 +425,8 @@ gtk_check_button_set_inconsistent (GtkCheckButton *check_button,
       else
         gtk_widget_unset_state_flags (GTK_WIDGET (check_button), GTK_STATE_FLAG_INCONSISTENT);
 
+      update_accessible_state (check_button);
+
       g_object_notify_by_pspec (G_OBJECT (check_button), props[PROP_INCONSISTENT]);
     }
 }